package com.kjs.common.tools;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 字符串校验器
 *
 * @author xuedingjiexueergou@gmail.com
 * @date 2018/10/12 13:58
 */
public class StringChecker {
    // 验证IP地址
    private static final String REGEX_IP = "((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)";
    private static final String REGEX_MOBILE = "^((13[0-9])|(14[5,7,9])|(15[^4,\\D])|(17[0,1,3,5-8])|(18[0-9]))\\d{8}$";
    private static final String REGEX_EMAIL = "^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$";

    private static boolean match(String reg, String str) {
        if (str == null || str.isEmpty()) return false;
        Pattern p = Pattern.compile(reg);
        Matcher m = p.matcher(str);
        return m.matches();
    }

    public static boolean ip(String str) {
        return match(REGEX_IP, str);
    }

    /**
     * 判断一个字符串是否合法的邮箱地址
     *
     * @param str
     * @return
     */
    public static boolean email(String str) {
        return match(REGEX_EMAIL, str);
    }

    /**
     * 判断一个字符串是否合法的手机号码
     * <p>
     * 13段：130、131、132、133、134、135、136、137、138、139
     * 14段：145、147
     * 15段：150、151、152、153、155、156、157、158、159
     * 17段：170、176、177、178
     * 18段：180、181、182、183、184、185、186、187、188、189
     *
     * @param str
     * @return
     */
    public static boolean mobile(String str) {
        return match(REGEX_MOBILE, str);
    }

    /**
     * 判断一个字符是否中文
     *
     * @param c
     * @return
     */
    public static boolean isChinese(char c) {
        Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
        if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
                || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
                || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
                || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
                || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
                || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {
            return true;
        }
        return false;
    }

    public static boolean isEmpty(String s) {
        return s == null || s.length() == 0;
    }

    /**
     * 判断字符串是否为空白（null或者没有内容）
     *
     * @param str
     * @return
     */
    public static boolean isBlank(String str) {
        return str == null || str.isEmpty();
    }
}
